Таким образом, почти каждый ответ здесь, кажется, пропустит конкретный момент. Переменные класса никогда не становятся переменными экземпляра, как показано в приведенном ниже коде. Используя метакласс, чтобы перехватить присвоение переменной на уровне класса, мы видим, что когда a.myattr переназначается, магия метода назначения полей в классе не вызывается. Это связано с тем, что присваивание создает новую переменную экземпляра. Это поведение абсолютно не имеет ничего общего с переменной класса, как показано вторым классом, который не имеет переменных класса и все же допускает присвоение поля.
class mymeta(type):
def __init__(cls, name, bases, d):
pass
def __setattr__(cls, attr, value):
print("setting " + attr)
super(mymeta, cls).__setattr__(attr, value)
class myclass(object):
__metaclass__ = mymeta
myattr = []
a = myclass()
a.myattr = [] #NOTHING IS PRINTED
myclass.myattr = [5] #change is printed here
b = myclass()
print(b.myattr) #pass through lookup on the base class
class expando(object):
pass
a = expando()
a.random = 5 #no class variable required
print(a.random) #but it still works
IN SHORT Переменные класса НИЧЕГО НЕ делают с переменными экземпляра .
Более ясно. Они просто попадают в область поиска по экземплярам. Переменные класса фактически являются переменными экземпляра для самого объекта класса. Вы также можете иметь метаклассивные переменные , если хотите, а также потому, что сами метаклассы тоже являются объектами. Все это объект, независимо от того, используется ли он для создания других объектов или нет, поэтому не следует привязывать семантику использования других слов в классе слов. В python класс - это просто объект, который используется для определения того, как создавать другие объекты и каковы их поведение. Метаклассы - это классы, которые создают классы, чтобы еще раз проиллюстрировать этот момент.
Вот ваша функция:
func createPDFFileAndReturnPath() -> String {
let fileName = "pdffilename.pdf"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectory = paths[0] as! NSString
let pathForPDF = documentsDirectory.stringByAppendingString("/" + fileName)
UIGraphicsBeginPDFContextToFile(pathForPDF, CGRectZero, nil)
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 100, 400), nil)
let font = UIFont(name: "Helvetica Bold", size: 14.0)
let textRect = CGRectMake(5, 3, 125, 18)
var paragraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.alignment = NSTextAlignment.Left
paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
let textColor = UIColor.blackColor()
let textFontAttributes = [
NSFontAttributeName: font!,
NSForegroundColorAttributeName: textColor,
NSParagraphStyleAttributeName: paragraphStyle
]
let text:NSString = "Hello world"
text.drawInRect(textRect, withAttributes: textFontAttributes)
UIGraphicsEndPDFContext()
return pathForPDF
}