对象创建属性的两种方法:
1.函数执行后给对象追加属性,例如:
class Boy:
def __init__(self):
pass #相当于空位符,保持语句完整
def speak(self):
print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy()
a.name="小明"#该方法不太严谨,不建议使用
a.age=23
a.speak()
生成结果
我的名字是小明,今年23岁
2.对象初始化时设置参数的属性并且当类的方法实例化时传入属性值(一般我们采用这种方式)
class Boy:
def __init__(self,name,age):
self.name=name
self.age=age
def speak(self):
print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy("小明",27)
a.speak()
生成结果
我的名字是小明,今年27岁类的实例创建
def __new__(cls,*args,**kwargs):
return object.__new__(cls);#固定语法结构
__new__()函数只能用于从object继承的新类,cls表示需要实例化的类;*args表示可变参数
若__new__没有正确返回当前类cls的实例,那么__init__将不会被调用
class Boy: def __new__(cls, *args, **kwargs): print("执行__new__",args[0],args[1]) return object.__new__(cls); def __init__(self,name,age): self.name=name self.age=age print("执行__init__",name,age) def speak(self): print("我的名字是%s,今年%s岁"%(self.name,self.age)) a=Boy("小明",27) a.speak()生成结果
执行__new__ 小明 27 #说明了参数先传给new这个函数 执行__init__ 小明 27 #自动调用参数 我的名字是小明,今年27岁
公有和私有属性,方法:
公有属性:除了类以外所有的对象都可以访问的属性
私有属性:仅限于本类可以访问
class Boy: def __init__(self,name,age): self.name=name self.__age=age 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问 def speak(self): print("我的名字是%s,今年%s岁"%(self.name,self.age)) a=Boy("小明",27) print("他的年龄:"%a.age) #结果AttributeError: 'Boy' object has no attribute 'age' a.speak()
封装:某个类把所需要的属性和方法限制在类的访问区域内外界不能看到可以设置端口访问。
用到两个函数:get/set方法不写__init__方法
class Boy: def set_name(self,name): self.__name=name #属性私有化 def get_name(self): #设置函数获得属性并返给外部的调用 return self.__name; a=Boy() a.set_name("xiaoming") print(a.get_name())
def __str__() 一个类的实例变成str,需要用特殊方法__str__()
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender p = Person('Bob', 'male') print (p) >>> <__main__.Person object at 0x02171270>
- class Person(object):
- def __init__(self, name, gender):
- self.name = name
- self.gender = gender
- def __str__(self):
- return '(Person: %s, %s)' % (self.name, self.gender)
- p = Person('Bob', 'male')
- print (p)
- >>> (Person: Bob, male)
.公有方法和私有方法;
私有方法在方法前加两个下划线:def __text():
自动销毁方法:__del__(): 当对象没有引用的时候,或程序结束的时候,程序自动调用__del__()
测试对象有多少次引用
import sys
t=T()
sys.getrefcount(t)返回2 从2开始
id()函数 查看对象的内存地址;
p="姐姐"
print(id(p)) #51850336
str1=[1,2,3,4]
print(id(str))#1732892336
.类属性:属于类成员,对象共有的;
类方法:cls 表明是 类
在方法上添加 @classmethod装饰器
def class_method(cls):
可以通过类方法调用类属性,也可以通过对象调用类属性;
修改类属性的2种方式:
1.类名.类属性=...
2.实例对象__class__类属性=...
静态方法:前面加@staticmethod,静态方法可以加参数,与类和对象都没有关系,也可以通过类和对象调用;
18. dir() __dir__ 展示一个类/对象的内部属性和函数;
p="姐姐" print(id(p)) #51850336 str1=[1,2,3,4] print(id(str))#1732892336