特殊方法(魔术方法)
- 2个下划线__ 开头和结尾
不需要自己调用
例如
- 初始化方法__init__
class MyClass():
print('MyClass类中的代码执行了')
def __init__(self,name): #初始化,实例化类后自动运行
self.name = name
def fn(a):
print('self.name = ',a.name)
mc = MyClass('实例mc')#实例化类后,类中__init__方法运行了
print(mc.name)
MyClass类中的代码执行了
实例mc
- 类的基本结构
类的基本结构
class 类名([父类]):
公共属性...
对象的初始化方法
def __init__(self,....)
....
其他的方法
def method(self,...)
....
封装
隐藏类中不希望被外部访问的属性或方法。
-
将类中的属性和方法名,修改为外部不知道的名
1- 这样外部不知道属性和方法名就无法直接访问 属性和方法
2- 可以设置getter,setter方法,来控制是否让外部访问 -
私有属性
一般对象前加2个下划线表示不让修改
2个下划线,其实是python解释器将变量,修改为
_类名__属性名
一般情况,不去修改私有属性
class Person:
def __init__(self,name,age):
self.__name=name
self.__age=age
p1=Person('Jim',20)
p1.__name='Dim' #修改不了,但无报错
print(p1._Person__name)#Jim
# 利用dir(p1) 查看属性
['_Person__age',
'_Person__name',
...
'__name',
...
@property装饰器
- @property装饰器
可以通过调用属性的方式调用方法
class Person:
def __init__(self,name):
self.name=name
@property
def get_name(self):
print('get_name方法执行了')
return self.name
@get_name.setter #方法.setter 这个装饰器用来补充修改get_name方法
def get_name(self,name):
self.name=name
p1=Person('Jim')
p1.get_name='Dim'
print(p1.get_name)#这里其实是调用了方法,但是写的形式是调用属性的形式,原因是get_name()方法前加了装饰器@property
get_name方法执行了
Dim
- @staticmethod #静态方法
写的时候不用带self参数,实例化时也不会传入实例对象作为第一个参数。
类或实例均可调用
class Person:
def __init__(self,name):
self.name=name
@staticmethod
def show_name(name):
print('show_name 方法执行了')
return name
p1=Person('Jim')
print(p1.show_name('abc'))
print(Person.show_name('123'))
show_name 方法执行了
abc
show_name 方法执行了
123
- @classmethod 这个装饰器用来指定方法只能调用类的属性和方法
第一个参数是类对象
class Person:
def __init__(self,name):
self.name=name
@property
def get_name(self):
print('get_name方法执行了')
return self.name
@staticmethod
def show_name(name):
print('show_name 方法执行了')
return name
@classmethod
def print_name(cls): #第一个参数是类对象
print('这是%s'%cls.show_name('abc'))#调用类中的方法
p1=Person('Jim')
p1.print_name()
show_name 方法执行了
这是abc