1、成员修饰符    2、特殊成员   3、metaclass,类的祖宗   
###成员修饰符###
公有和私有

 #__author:_nbloser
#date:2018/1/19 #私有类、对象成员变量,方法;在前面加两个下划线'__'
class Person:
__lover = '***' # 私有类字段,外部不能够直接访问 @staticmethod
def retu_lover():
return Person.__lover def __init__(self,name,age):
self.name = name
self.__age = age # 私有对象字段,外部不能够直接访问 @property
def show_age(self):
return self.__age obj = Person('x',21)
print(obj.name)
print(obj.show_age) # 通过python属性获取

****子类也不能直接访问父类的私有字段

### 特殊成员###
#__call__方法

class  Person:
def __init__(self):
print('init')
def __call__(self,*args,**kwargs):
print('call')
obj = Person()
obj() # 这个对应的是执行__call__方法,一般也不用

#__add__方法

class  Person:
def __add__(self,other):
return 123 # self=obj,other=obj2,可以让这个两个对象的字段相加,或者其他操作 obj = Person()
obj2 = Person()
x = obj + obj2 # 两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当作参数传递进入
print(x,type(x)) # 123<class'int'>

#__dict__(重点)

class  Person:
def __init__(self, name,age):
self.name = name
self.age = age
obj = Person('x',21)
print(obj.__dict__) # {'name':'x','age':21}
# 通过字典把成员显示出来

## __getitem__、__setitem__、__delitem__方法、切片
只有__getitem__有返回值

class Person:
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self,item):
return item + 10 def __setitem__(self,key,value):
print(key,value) def __delitem__(self,key):
print(key) k = Person('x',21)
c = k[8] # 对应执行__getitem__方法
print(c)
k[8] = 235 # 8 235 # 对应执行__setitem__方法
del k[8] # 8 # 对应执行__delitem__方法

加上切片处理的,以__getitem__方法为例

def  __getitem__(self,item):
# 如果item是基本类型:int,str,索引获取。如果是slice对象的话,切片
if type(item) == slice:
print(item.start)
print(item.stop)
print(item.step)
print('切片处理')
else:
print('索引处理') c = k[8] # 索引处理
c = k[8:10:2] # 切片处理

##实现对象可以迭代

class  Person:
def __init__(self,name,age):
self.name = name
self.age = age def __iter__(self):
return iter([11,22,33]) l = Person('x',21)
for i in l:
print(i)

这里只是介绍。

###metaclass,类的祖宗###

def function(self):
print(213)
Foo = type('foo',(object,),{'func':function})
r = Foo()
r.func()

这样也是声明了一个类

这个我不知道为什么实现不了,所以我直接截图了。而且很懵,不知道用得多不多,暂时没有找别的博客,好像在Java里面好像没有看到使用太多这些。
先执行type的方法,才执行类的方法

obj真正是在__new__里面创建的
盗过来的创建对象流程图,作者:武沛齐

一些有关的代码:(有的话会继续编辑补上)

1、example_043  in  java_300

 public class Book
{
private String title;
private String author;
private double price;
public Book(String title, String author, double price) {
super();
this.title = title;
this.author = author;
this.price = price;
}
public String getTitle()
{
return title;
}
public String getAuthor()
{
return author;
}
public double getPrice()
{
return price;
} }

Book.java

 public class Test
{
public static void main(String[] args)
{
// TODO 自动生成的方法存根
Book book = new Book("x", "_nblsoer", 99999.99);
System.out.println("书名:"+book.getTitle());
System.out.println("作者:"+book.getAuthor());
System.out.println("价格:"+book.getPrice());
}
}

run.java

 # __author: _nbloser
# date: 2018/1/22 class Book:
def __init__(self, book_name, author, price):
self.__book_name = book_name
self.__author = author
self.__price = price @property
def book_name(self):
return self.__book_name @book_name.setter
def book_name(self, val):
self.__book_name = val @property
def author(self):
return self.__author @author.setter
def author(self, val):
self.__author = val @property
def price(self):
return self.__price @price.setter
def price(self, val):
self.__price = val

book.py

 # __author: _nbloser
# date: 2018/1/22 import book
book = book.Book('xxxx','_nbloser',964)
print(book.book_name,book.author,book.price)
book.book_name = 'change'
book.author = 'a loser'
book.price = 99999999.99
print(book.book_name,book.author,book.price)

run.py

2、

028class_part2的更多相关文章

随机推荐

  1. 3、在Shell程序中使用的参数

    学习目标位置参数内部参数 如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数.Shell程序中的参数分为位置参数和内部参数等. 12-3-1 位置参数由系统提供的参数称为位 ...

  2. C#中加粗label的字体

    1. 在C#的代码中想直接加粗label控件的字体, label1.Font.Bold = true;//发现系统会提示Font.Bold是只读属性 如果必须要加粗字体呢,方法如下: 2. 使用Fon ...

  3. JNI注册调用完整过程-安卓4.4

    在Android系统中,JNI方法是以C/C++语言来实现的,然后编译在一个so文件里面,以我之前的例子为例Android Studio使用JNI,调用之前要加载到当前应用程序的进程的地址空间中: s ...

  4. FocusBI: SSIS体系结构(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...

  5. (原创).Net将EF运用于Oralce一 准备工作

    网上有很多EF运用于Oracle的博文,但是找了半天发现大多数博文大都语焉不详,于是决定自己折腾. 首先我的开发工具为vs2010,那么最适用于VS2010的EF版本为多少呢?答案是EF5.我在Sta ...

  6. JS实现队列

    JS实现队列: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾 ...

  7. SQL语句表处理

    1.create table:创建表,语法: create table 表格名 ( 列名 数据类型, 列名 数据类型, ...... ) 2.constrain:约束,关键词 NOT NULL. UN ...

  8. php array 数组及数组索引

    array (PHP 4, PHP 5, PHP 7) array — 新建一个数组 说明 array array ([ mixed $... ] ) 创建一个数组.关于数组是什么的信息请阅读数组一节 ...

  9. ActiveMQ整合spring结合项目开发流程(生产者和消费者)总结

    一:生产者代码编写: 1.配置pom.xml引入相关坐标 <dependencies> <!-- spring开发测试 --> <dependency> <g ...

  10. spring历史和哲学

    spring 历史: 2004年 Spring Framework 1.0 final 正式问世. 1.在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分 ...