只要将类对象看作是【无参数函数】即可,它返回新的类实例
x = Myclass()
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法。若类定义了 __init__(),类的实例化操作会自动为【新创建的类实例】调用__init__() :
def __init__(self):
self.data = []
当然__init__() 可以有参数,同样传递给实例对象:
class Complex(object):
def __init__(self, realpart, imagpart):
self.realpart = realpart
self.imagpart = imagpart
x = Complex(1, 2)
x.realpart, x.imagpart
类属性的读取方法:
一般如下直接访问和更改:
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> std = Student("Kushal Das")
>>> print(std.name)
Kushal Das
>>> std.name = "Python"
>>> print(std.name)
Python
不要在类里定义setters 或getters 方法。 即使采用_或__作开头命名变量,也只能警告,并不会阻止访问。
若要精确控制属性的访问,就用@property,这是它的存在意义。它能将一个【类方法】变成【只读属性】,从而能用.语法访问;以及实现一个属性的getter和setter。
#!/usr/bin/env python3
class Account(object):
"""账号类,
amount 是美元金额.
"""
def __init__(self, rate):
self.__amt = 0
self.rate = rate
@property
def amount(self):
"""账号余额(美元)"""
return self.__amt
@property
def cny(self):
"""账号余额(人名币)"""
return self.__amt * self.rate
@amount.setter # amount变为属性后,为其创建一个setter方法。用一个名为@amount.setter的装饰器装饰 同样名为"amount"的第二个method来实现。
def amount(self, value):
if value < 0:
print("Sorry, no negative amount in the account.")
return
self.__amt = value
if __name__ == '__main__':
acc = Account(rate=6.6) # 基于课程编写时的汇率
acc.amount = 20
print("Dollar amount:", acc.amount)
print("In CNY:", acc.cny)
acc.amount = -100
print("Dollar amount:", acc.amount)