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. 关于Jquery事件绑定的心得

    今日在工作的时候,遇上了一些和事件绑定有关的问题无法解决,于是在网上找到了以下资料,稍加整理了下. 对于事件绑定,jQuery的 bind / unbind 大多数时候可能并不会用到,取而代之的是直接 ...

  2. linux系统下图片的路径

    1. 图片跟网页或者程序在同一目录下 直接 src="abc.jpg" 如果不行 就加多一个斜杠 src="/abc.jpg"

  3. EF 连接到 Azure-SQL

    using Autofac; using Autofac.Integration.Mvc; using System; using System.Collections.Generic; using ...

  4. python 正则表达式应用——缩写词扩充

    看具体示例 import re def expand_abbr(sen, abbr): lenabbr = len(abbr) ma = '' for i in range(0, lenabbr): ...

  5. FZU 2138——久违的月赛之一——————【贪心】

    久违的月赛之一 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  6. FZU2177——ytaaa——————【区间dp】

     ytaaa Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  7. wtl学习总结

    在windows平台,相比MFC,我更喜欢WTL,因其简洁漂亮.所以陆续花了一年的时间学习之,这里总结一下(在学习Wtl/Atl之前,最好是对WinApi编程有一定的了解). 安装 Wtl主页 htt ...

  8. Memcached 查询stats及各项状态解释

    一.两个最常用状态查询(掌握第一个就完全OK了) 1)查看状态:printf “stats\r\n” |nc 127.0.0.1 11211      2)模拟top命令查看状态:watch “ech ...

  9. 【关于迭代器的for-each遍历集合现象。。。。。】

    foreahc迭代集合元素的同时修改集合元素抛异常..ConcurrentModificationException异常 只要使用迭代器遍历,其他集合遍历时进行增删操作都需要留意是否会触发Concur ...

  10. 移除TFS服务器关系

    移除TFS服务器关系:1.将项目和从以前的TFS服务器断开.2.退出VS.3.找到C:\Documents and Settings\Administrator\Local Settings\Appl ...