一:定义类
定义类语法:class 类名(命名规范:首字母大写,驼峰法):
类的内部结构
二:创建对象
通过 类名 + ‘()’ 方式创建
示例:
class Lei:
pass
stu = Lei()
三:属性(field):
- 实例属性(实例变量):通过类创建出来(定义在 init 里)(由对象自身调用)
每一个通过该类创建出来的对象都维护自己独有的实例属性,互不影响(每个对象私人订制,专属) - 类属性(类变量):在类里直接创建出来,由类来维护,所有通过该类创建的对象都能访问到(公共资源,大众)
(由类调用)
示例:
class Student:
name = '我是类属性'
def __init__(self): # __init__必须传一个 self 参数,且该参数永远指向通过该类创建的对象
# init__函数在通过该类创建对象时,自动调用__init__,不需要手动调用
self.name = '我是实例属性'
四:方法
- 实例方法:属于对象自己的方法,由对象自己维护(每个对象的私人订制,专属)
- 类方法:属于类的方法,有类来维护(对象的公有财产)
- 静态方法:该方法和类与对象没有任何关系,没有任何指针,占据类的命名空间,调用时通过类名 ‘.’方法名调用
注意:无论变量还是方法,由谁维护,就由谁调用
示例:
class Fangfa:
def __init__(self):
print('我是实例方法')
print(self) # 对象本身,一旦绑定就不会更改
@classmethod
def lei(cls):
print('我是类方法,通过类的修饰器 classmethod声明')
print(cls) # 类本身,类方法只能访问类属性,不能访问对象属性
@staticmethod
def jing(): # 没有参数
print('我是静态方法,通过类的修饰器 staticmethod声明')
# 如果某个方法不需要操作类或对象,就可以声明为静态方法
# 使用场景见下文
静态方法使用场景:假如需要一个类即可以通过传入的时间参数创建对应的对象,也可以通过目前时间创建,就可以通过静态方法
import time # 引入时间模块
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@staticmethod
def nowDate():
t = time.localtime() # 创建时间对象
return Date(t.tm_year, t.tm_mon, t.tm_mday)
date = Date(2017, 10, 27) # 根据传参创建对应对象
print(date.year) # 2017
print(date.month) # 10
print(date.day) # 27
dateNow = Date.nowDate() # 根据当前日期创建对象
print(dateNow.year) # 当前年
print(dateNow.month) # 当前月
print(dateNow.day) # 当前日
五:特性:保护对象属性不被随意修改
原理:通过类的修饰器 @property 声明一个与被保护属性同名函数(该函数由类调用时,与调用属性方法一样)
然后改变该属性名,将该属性访问操作放在特性里(拗口,看代码很简单)
示例
class Texing:
def __init__(self):
self._name = '特性'
@property
def name(self):
return self._name # 返回真实该属性值
texing = Texing()
print(texing.name) # 此时访问的name属性其实是类的name方法,值通过name方法返回,
# 类似在 _name 属性外加了层保护套
texing.name = '更改值' # 此时这样是不能更改name值,同上理,用户只能访问不能更改
如果需要更改特性值(特性代表的是它保护的属性,如示例中 特性 name 保护的属性时 _name,一下同一)
需要通过设置器(也可以叫拦截器,拦截修改特性的操作,并设定修改值得类型,满足就修改,不满足不让修改)
语法: @特性名.setter
同时也可以删除某个特性值(及对应属性值)
语法:@特性名.deleter,然后通过关键字del删除
示例
class delTexing:
def __init__(self):
self._age = 12
@property
def age(self):
return self._age
@name.setter
def age(self, value):
if type(value) is int:
self._age = value
else:
print('修改的值不能是整数外的值')
@age.deleter
def age(self):
del self._age
dT = delTexing()
print(dT.age) # 12
dT.age = 'ahah' # 不能更改,因为不是数字类型,打印 ‘修改的值不能是整数外的值’
dT.age = 20
print(dT.age) # 20 更改成功
del dT.age #删除age属性
属性私有化:让当前类的私有属性,不能被子类继承到
py中的私有化机制:属性名改写。在所有需要私有化的属性前添加“”,则该属性名会变为:类名_属性名
示例
class Student:
def __init__(self):
self.__name = '张三'
def __say(self):
print('hello,我是' + self.__name)
stu = Student()
stu._Student__say();
print(stu._Student__name)
网友评论