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. 【LESS系列】简介和使用

    LESS —— 一个CSS预编译框架,它在CSS的语法基础之上,引入了变量.Mixin(混入).运算以及函数等功能,大大简化了CSS的编写,并且降低了CSS的维护成本,就像它的名称所说的那样,LESS ...

  2. 在windows服务器上设置301、伪静态(wordpress)

    新建一个httpd.ini文件,插入代码: [ISAPI_Rewrite] RewriteCond Host: ^wuchao\.cc$ RewriteRule (.*) http\://www\.w ...

  3. npm 配置

    设置代理 $ npm config set proxy http://server:port $ npm config set https-proxy https://server:port 如果代理 ...

  4. zookeeper【2】集群管理

    Zookeeper 的核心是广播,这个机制保证了各个Server之间的同步.实现这个机制的协议叫做Zab协议. Zab协议有两种模式,它们分别是恢复模式(选主)和广播 模式(同步).当服务启动或者在领 ...

  5. Incorrect column count: expected 1, actual 5

    在使用jdbc的querForObject queryForList的时候,出现Incorrect column count: expected 1, actual 5 比如 String sql = ...

  6. JS对象原型的理解

    基于原型的语言 JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象 ...

  7. react antd Warning: must set key for <rc-animate> children

    location 有可能是一个‘’,''.split() 将输出[""],是个含有空字符串的数组,而[]是个什么都没有的数组,两者不同. code: change initialV ...

  8. html高度塌陷问题解决

    高度塌陷的问题: 当开启元素的BFC以后,元素将会有如下的特性 1 父元素的垂直外边距不会和子元素重叠    开启BFC的元素不会被浮动元素所覆盖    开启BFC的元素可以包含浮动的子元素 如何开启 ...

  9. Cookie实现留言板

    Cookie实现留言板 直接代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content- ...

  10. codeforces之始

    很早就听说acmer界的CF嘞!还记得刚开始听到神犇们在讨论CF的时候我还以为是网游CF(穿越火线)呢... 今年刚开学的时候就打算开始打cf的,由于一些事情耽搁了.之后又要准备省赛所以就一直拖到现在 ...